package com.by.bean;

import com.by.common.group.ISave;
import com.by.common.group.IUpdate;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
/**
 * 使用 @ApiModel 注解来描述一个实体类，此处指明该类代表“用户”模型。在SwaggerAPI文档中显示
 */
@ApiModel("用户")
public class User {
    /**
     * 用户ID字段。
     * - 通过 @ApiModelProperty 注解提供对该字段的详细描述。
     * - 参数 "name = 'id'" 指定此字段的名称为 "id"；
     * - 参数 "value = '用户id'" 提供关于该字段的详细描述，表示此字段为用户的唯一标识符（用户id）；
     * - 参数 "hidden = true" 表示此字段在生成的 API 文档中将被隐藏；
     * - 参数 "required = false" 表示此字段不是必需的，客户端可以不提供该参数。
     */
    @ApiModelProperty(name = "id", value = "用户id", hidden = true, required = false)
    /**
     * 用户ID属性，标识用户的唯一身份。
     * 当执行更新操作时，此字段必须存在且不能为空，以确保能够正确识别要修改的用户记录。
     * IUpdate.class
     * {IUpdate.class}：这里 {IUpdate.class} 指定了一个名为 IUpdate 的验证组。
     * 这意味着只有当验证器检查属于这个组的约束时，该注解才会被触发。
     * 通常情况下，你会有一个接口 IUpdate 定义了此组，
     * 并且可以在实现该接口的具体方法中引用它来指明哪些字段需要在这种上下文中被验证。
     * 例如，在更新用户信息的操作中，你可能会关心是否提供了有效的用户 ID 来标识哪个用户的记录需要更新。
     * 此时就可以利用 @NotNull(groups = IUpdate.class) 注解确保在这个特定的情况下用户 ID 不为空。
     */
//    @NotNull(message = "修改时用户id不能为空", groups = {IUpdate.class})
    private Integer id;
    @ApiModelProperty(name = "account", value = "账号", required = true)
    /**
     * 用户名属性，标识用户的唯一身份。
     * 必须填写且不能为空。
     */
    @NotBlank(message = "账号不能为空")
    @Length(min = 6, message = "账号至少6位！", groups = {ISave.class, IUpdate.class})
    private String username;
    @ApiModelProperty(name = "password", value = "密码", required = true)
    /**
     * 密码属性，用于验证用户的身份。
     * 必须填写且不能为空，并遵循一定的复杂度规则：长度为8到12位，
     * 只能包含字母、数字和下划线。
     */
    @NotEmpty(message = "密码不能为空")
    @Pattern(regexp = "^[a-zA-Z0-9_]{8,12}$", message = "密码由字母、数字、下滑线组成的8-12位",
            groups = {ISave.class, IUpdate.class})
    private String password;
    @ApiModelProperty(value = "用户类型", hidden = true)
    private Integer type;
    String roleName;

    String identification;
    int status;
}
